# -*- coding: utf-8 -*-

# 版权所有 (c) [王广旭]，本程序创作于[2025年1月19号]
# 本程序由王广旭开发，保留所有权利。
# 严禁将本程序以任何形式用于商业用途。
# 非商业使用需遵循以下条件：
# - 不得删除或修改此版权声明。
# - 若对程序进行再分发，需包含此版权声明。


import os
import time
from time import sleep

from common.utils.adb_and_excel_manager import AdbAndExcelManager
from common.utils.common_functions import current_time_to_str, exit_program
from common.utils.licensee import Licensee


def main():
    print("""
# 版权所有 (c) [王广旭]，本程序创作于[2025年1月19号]
# 本程序由王广旭开发，保留所有权利。
# 严禁将本程序以任何形式用于商业用途。
# 非商业使用需遵循以下条件：
# - 不得删除或修改此版权声明。
# - 若对程序进行再分发，需包含此版权声明。
    """)

    # 判断程序是否已授权
    licensee = Licensee()

    if not os.path.exists("logs"):
        os.makedirs("logs")
    adb_and_excel_manager = AdbAndExcelManager()
    adb_and_excel_manager.test_parameter_init()
    excel_read = adb_and_excel_manager.excel_read
    adb_manager = adb_and_excel_manager.adb_manager
    if os.path.exists(excel_read.script):
        print("启动测试脚本 {}".format(excel_read.script))
        os.system('start /d ".\\" %s' % excel_read.script)
    else:
        print("{} 测试脚本不存在，当前只监听app".format(excel_read.script))

    crash_number = 0
    adb_manager.app_pid = adb_manager.get_app_pid(excel_read.device_identifier, excel_read.app_package_name)
    print(f"{current_time_to_str()}  开始监听")

    while True:
        try:
            with open(adb_manager.system_resource_consumption_path, 'a') as file:
                while True:
                    start_time = int(time.perf_counter()) * 1000
                    res = adb_manager.is_app_crash(excel_read.device_identifier, excel_read.app_package_name)
                    if not res:
                        crash_number = 0
                        parameter = adb_manager.get_app_resource_usage(excel_read.device_identifier,
                                                                       excel_read.app_package_name)
                        current_time = current_time_to_str()
                        resource_usage = "Time：{}  PID：{}  CPU：{}  VSIZE：{}Kb  Rss：{}Kb  Native：{}Kb  Dalvik：{}Kb" \
                            .format(current_time, adb_manager.app_pid,
                                    parameter[0], parameter[1], parameter[2], parameter[3], parameter[4])
                        print(resource_usage)
                        if licensee.is_provide_demo:
                            file.write(f"{current_time}  演示版本不保存数据\n")
                        else:
                            file.write(f"{resource_usage}\n")
                        stop_time = int(time.perf_counter()) * 1000
                        wait = excel_read.monitor_crash_interval - stop_time + start_time
                        # print(f"耗时: {stop_time - start_time}")
                        if wait > 0:
                            sleep(wait / 1000.0)
                        continue
                    elif res == 1:
                        crash_number += 1
                        print("******************* APP崩溃 **********************")
                        print("******************* APP崩溃 崩溃次数：{} **********************".format(crash_number))
                        os.system("echo {}  *******************APP崩溃********************** >> {}"
                                  .format(current_time_to_str(), adb_manager.log_path))
                    else:
                        crash_number += 1
                        print("******************* APP无活动 **********************")
                        print("******************* APP崩溃 崩溃次数：{} **********************".format(crash_number))
                        os.system("echo {}  ******************* APP无活动 ********************** >> {}"
                                  .format(current_time_to_str(), adb_manager.log_path))

                    if os.path.exists(excel_read.script):
                        print("关闭测试脚本 {}".format(excel_read.script))
                        os.system('taskkill /f /im %s' % excel_read.script)
                    adb_manager.capture_log_png(excel_read.device_identifier, excel_read.crash_logs_number)
                    if crash_number > excel_read.crash_number:
                        exit_program(f"已达到最大崩溃次数{excel_read.crash_number}")
                    i = 0
                    while i < 3:
                        print("******************* 设备自启 等待120s **********************")
                        if licensee.is_provide_demo:
                            print("******************* 当前为演示模式 只等待1s **********************")
                            sleep(1)
                        else:
                            sleep(120)
                        if not adb_manager.is_app_crash(excel_read.device_identifier, excel_read.app_package_name):
                            break
                        i += 1
                    if i >= 3:
                        if not adb_manager.is_app_running(excel_read.device_identifier, excel_read.app_package_name):
                            adb_manager.start_app(excel_read.device_identifier, excel_read.app_package_name,
                                                  excel_read.app_startup_activity)
                            if not adb_manager.is_app_running(excel_read.device_identifier, excel_read.app_package_name):
                                exit_program("app启动异常")
                    adb_manager.test_start_time = current_time_to_str()
                    adb_manager.update_path()
                    adb_manager.app_pid = adb_manager.get_app_pid(excel_read.device_identifier, excel_read.app_package_name)
                    if os.path.exists(excel_read.script):
                        print("启动测试脚本 {}".format(excel_read.script))
                        os.system('start /d ".\\" %s' % excel_read.script)
                    else:
                        print("{} 测试脚本不存在，当前只监听app".format(excel_read.script))
                    break
        except Exception as e:
            exit_program(f"Error: {e}")


if __name__ == "__main__":
    main()

